package com.example.boot.webservice.provider.config;

import com.example.boot.webservice.provider.service.UserService;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.xml.ws.Endpoint;


@Configuration
public class WebServiceConfig {

    @Autowired
    private UserService userService;

    /**
     * Apache CXF 核心架构是以 Bus 为核心，整合其他组件。
     * Bus 是 CXF 的主干, 为共享资源提供一个可配置的场所，作用类似于 Spring 的 ApplicationContext，这些共享资源包括
     * WSDL 管理器、绑定工厂等。通过对 Bus 进行扩展，可以方便地容纳自己的资源或者替换现有的资源。
     * 默认 Bus 实现基于 Spring 架构，通过依赖注入，在运行时将组件串联起来。BusFactory 负责 Bus 的创建。
     * 默认的 BusFactory 是 SpringBusFactory，对应于默认的Bus实现。
     * 在构造过程中，SpringBusFactory 会搜索 META-INF/cxf（包含在 CXF 的jar中）下的所有 bean 配置文件。
     * 根据这些配置文件构建一个 ApplicationContext，开发者也可以提供自己的配置文件来定制 Bus。
     */
    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }

    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(springBus(), userService);
        endpoint.publish("/ws/api");
        return endpoint;
    }
}
